﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Sistema.WF.Componentes.FormulariosBase;
using Sistema.Dominio;
using Sistema.Util;
using System.Security;
using Sistema.WF.View.NFE;
using Sistema.NFe;


namespace Sistema.WF.View.NFe
{
    public partial class FRM_principal : FRM_pai
    {
        private IList<NFeInfo> _notasListadas;
        private NFeInfo _notaSelecionada;
        private IList<String> _caminhoSelecionadas;

        public FRM_principal()
        {
            InitializeComponent();
        }

        private void FRM_principal_Load(object sender, EventArgs e)
        {
            _notasListadas = new List<NFeInfo>();
            _notaSelecionada = new NFeInfo();
            _caminhoSelecionadas = new List<String>();

            this.PreencherGrid();
        }



        private IList<NFeInfo> RecolherDoGrid()
        {
            try
            {
                IList<NFeInfo> nfe = new List<NFeInfo>();
                NFeInfo nota = new NFeInfo();

                for (int i = 0; i < GRD_nota.Rows.Count; i++)
                {
                    if (((bool)GRD_nota.Rows[i].Cells[0].Value))
                    {
                        nfe.Add(_notasListadas[i]);

                    }
                    
                    
                }

                return nfe;
            }
            catch (ViewException ex)
            {
                throw new ViewException(ex,"Operação sem nota selecionada no grid", "Por favor, selecione uma nota");
            }
        }

        private void CMD_inutilizar_Click(object sender, EventArgs e)
        {
            FRM_inutilizarNota inutilizar = new FRM_inutilizarNota();
            inutilizar.ShowDialog();
            this.PreencherGrid();
        }

        private void CMD_exportar_Click(object sender, EventArgs e)
        {
            try
            {
                FRM_ExportarNota exportar = new FRM_ExportarNota();
                exportar.ShowDialog();
            }
            catch (ViewException ex)
            {
                
                throw new ViewException(ex,"Erro durante exportação de notas fiscais.","Erro ao Exportar Notas. Selecione um período de tempo válido") ;
            }
        }

        private void CMD_email_Click(object sender, EventArgs e)
        {
             FRM_email email = new FRM_email();
                email.ShowDialog();
            
        }

        private void CMD_enviar_Click(object sender, EventArgs e)
        {
            FRM_EnviaNota enviar = new FRM_EnviaNota();
            enviar.ShowDialog();
            this.PreencherGrid();

        }

        private void CMD_cancelar_Click(object sender, EventArgs e)
        {
            try
            {
                IList<NFeInfo> notasSelecionadas = this.RecolherDoGrid();
                if (notasSelecionadas.FirstOrDefault().StatusNota == enumStatusNota.Liberada)
                {
                    //FRM_CancelarNota cancelar = new FRM_CancelarNota(notasSelecionadas);
                    FRM_ConfirmaCancelamento confirmar = new FRM_ConfirmaCancelamento(notasSelecionadas);
                    confirmar.Pesquisar();
                    this.PreencherGrid();
                }
                else
                {
                    Util.CaixaMensagem.CaixaDeMensagem("Esta nota fiscal não pode ser cancelada.\n Para ser cancelada, a nota deve estar liberada para uso.", "Atenção");
                }


            }
            catch (ViewException ex)
            {

                throw new ViewException(ex, "Certificado digital não selecionado.", "Por favor, selecione um Certificado Digital.");
            }
            catch(Exception)
            {
                CaixaMensagem.CaixaDeMensagem("Por favor, selecione um certificado digital");
                throw ;
            }
        
        }

        private Bitmap iconeStatus(enumStatusNota dados)
        {
            Bitmap coluna ;
            switch(dados)
            {
                case enumStatusNota.Cancelada: coluna = Properties.Resources.cancelada;
                    break;

                case enumStatusNota.Enviada: coluna = Properties.Resources.enviada;    
                   break;

                case enumStatusNota.Inutilizada: coluna = Properties.Resources.inutilizada;
                    break;

                case enumStatusNota.Liberada: coluna = Properties.Resources.liberada;
                    break;

                case enumStatusNota.Rejeitada: coluna = Properties.Resources.rejeitada;
                    break;

                default : coluna = Properties.Resources.aguardando;
                    break;
             }
            return coluna;
        }
        private IList<NFeInfo> CarregaDadosDeArquivos()
        {
                Sistema.NFe.NFe pesquisaNotas = new Sistema.NFe.NFe();
                IList<NFeInfo> dados = new List<NFeInfo>();
                string caminho = Properties.Resources.CaminhoXmlEnviar;

                Arquivo leitorArquivo = new Arquivo();
                IList<String> arquivos = leitorArquivo.ListarArquivo(caminho);//, "*.xml"
                foreach (String xml in leitorArquivo.LerArquivo(arquivos))
                {
                    dados.Add(pesquisaNotas.LerDadosNFe(xml));
                }
                return dados;
            
        }
        private void PreencherGrid()
        {
            GridHelper.AtualizarGrid(GRD_nota);

            Sistema.NFe.NFe nfe = new Sistema.NFe.NFe();
            

            IList<NFeInfo> lista = new List<NFeInfo>();
            IList<NFeInfo> teste = new List<NFeInfo>();

            Object[] header = new Object[7];

            lista = nfe.Listar("Numero");
            
           

            for (int i = 0; i < lista.Count; i++ )
            {
                header[0] = false;
                header[1] = this.iconeStatus(lista[i].StatusNota);

                if (lista[i].StatusNota == enumStatusNota.Rejeitada)
                {
                    header[2] = lista[i].DadosEnvio.LastOrDefault().Status;
                    header[3] = lista[i].DadosEnvio.LastOrDefault().DescricaoStatus;
                }
                else
                {  
                    
                    header[2] = String.Empty;
                    header[3] = "Nota "+lista[i].StatusNota.ToString();
                }
                
                    header[4] = IdentificaXml.completarNumeroNota(lista[i].Numero.ToString());
                    header[5] = lista[i].Serie;
                    header[6] = lista[i].Dados.DestinatarioRazaoSocial;

                GRD_nota.Rows.Add(header);
            }
            this.ExibeToolTipText(lista);
            _notasListadas = lista; 
        }

        private void ExibeToolTipText(IList<NFeInfo> lista)
        {
            for (int i = 0; i < lista.Count; i++)
            {
                GRD_nota.Rows[i].Cells[1].ToolTipText = lista[i].StatusNota.ToString();
            }

        }

        private void CMD_sair_Click(object sender, EventArgs e)
        {
            this.Close();
            this.Dispose();
        }

      
        private void CriarArquivo(IList<NFeInfo> dados)
        {
            Arquivo arquivo = new Arquivo();

            for (int i = 0; i < dados.Count; i++)
            {
                String nomeArquivo = "nfe" + IdentificaXml.completarNumeroNota(dados[i].Numero)+ ".xml";
                String XmlAssinado = (from a in dados[i].DadosEnvio
                                      where a.Status == "100"
                                      select a.XmlAssinado).FirstOrDefault();
                arquivo.CriarArquivo(XmlAssinado, nomeArquivo, Properties.Resources.CaminhoXMLBackupRemoto);
            }

        }
        private void cmd_backup_Click(object sender, EventArgs e)
        {
            try
            {
                Arquivo arquivo = new Arquivo();
                FTP ftp = new FTP();
                //SecureString secure = new SecureString();


                IList<NFeInfo> lista = GridHelper.RecolherDoGrid<NFeInfo>(GRD_nota,true, _notasListadas);
                this.CriarArquivo(lista);

                IList<String> listaArquivos = arquivo.buscarArquivo(Properties.Resources.CaminhoXMLBackupRemoto);

                String url = Properties.Resources.URLFTP;
                String login = Properties.Resources.LoginFTP;
                String senha = Properties.Resources.SenhaFTP;
                String diretorio = Properties.Resources.DiretorioFTP + new System.Configuration.AppSettingsReader().GetValue("CNPJ",typeof(String))+"/";
               
                ftp.Enviar(url, diretorio, listaArquivos, login, senha);
                arquivo.ExcluirArquivo(listaArquivos, Properties.Resources.CaminhoXMLBackupRemoto);


                url = null;
                login = null;
                senha = null;
                diretorio = null;
              CaixaMensagem.CaixaDeMensagem("Arquivos salvos com Sucesso!");

            }
            catch (ViewException ex)
            {

                throw new ViewException(ex,"Não foi possível transferir arquivo ao servidor remoto.\n Verifique sua conexão com a internet.");
            }



        }
        private NFeInfo StatusNota(NFeInfo lista )
        {
            
                ConsultaStatusNFe consultaStatus = new ConsultaStatusNFe();
                consultaStatus.ConsutarStatus(lista, new Util.CertificadoDigital().PesquisarCertificadoDigital());
            
                return lista;
           
        }

        private void CMD_danfe_Click(object sender, EventArgs e)
        {
            IList<NFeInfo> notasSelecionadas = this.RecolherDoGrid();
            NFeInfo liberada;
            IList<NFeInfo> notalib = new List<NFeInfo>();

            foreach (NFeInfo nota in notasSelecionadas)
            {
                ConsultaStatusNFe consultaStatus = new ConsultaStatusNFe();
                consultaStatus.ConsutarStatus(nota,new CertificadoDigital().PesquisarCertificadoDigital());

                if (nota.StatusNota == enumStatusNota.Enviada)
                {
                    
                    liberada = consultaStatus.PesquisaPorNumeroSerie(nota.Numero, nota.Serie);
                    notalib.Add(liberada);
                }

                if (nota.StatusNota == enumStatusNota.Liberada)
                {
                    liberada = consultaStatus.PesquisaPorNumeroSerie(nota.Numero, nota.Serie);
                    notalib.Add(liberada);

                    FRM_danfe tela = new FRM_danfe(notalib);
                    tela.ShowDialog();
                }
                else
                {
                    Util.CaixaMensagem.CaixaDeMensagem("Para ter o danfe impresso a nota precisa estar liberada para uso.\nTente novamente");
                }
                
                this.PreencherGrid();

            }
        }

        private void CMD_legenda_Click(object sender, EventArgs e)
        {
            FRM_legenda tela = new FRM_legenda();
            tela.ShowDialog();
        }

        private void CMD_visualizar_Click(object sender, EventArgs e)
        {
            try
            {
                IList<NFeInfo> lista = this.RecolherDoGrid();
                FRM_visualizarNota visualizar = new FRM_visualizarNota(lista[0].DadosEnvio.FirstOrDefault().XmlAssinado);
                visualizar.ShowDialog();
            }
            catch (ViewException ex)
            {
                throw new ViewException(ex, "Não foi possível visualizar a nota.", "Erro ao visualizar nota. Verifique sua conexão coma internet.");
            }
        }


           

        
    }
}
